package com.amado.course37CharStream.homework;

import java.io.*;
import java.util.*;
import java.util.Map.Entry;

import com.amado.course07Array.Array;

/**
 * 文件搜索 2、输入文件夹地址、文件名称（模糊查询）、内容三个条件，查找出对应的文件名称与文件中所在的行数 例如：输入D:\\temp 屠龙 张无忌
 * 找到D:\\temp文件夹下文件名包含小说的且内容包含张无忌的文件及张无忌所在文件中的行数， 结果：D:\\temp\\倚天屠龙记.txt 12行 24行
 * D:\\temp\\小说\\倚天屠龙记后传.txt 200行 D:\\temp\\小说\\屠龙宝刀.txt 230行 Created by
 * Administrator on 2018/8/3.
 */
public class FileSearch {
	public static void main(String[] args) {
		File file = new File("D:\\gitCode\\javase\\src\\main\\java\\com\\amado\\course37CharStream\\homework");
		// 1、找到所有的文件
		// 2、去文件中查找是否包含对应的文字
		List<File> listFile = getFile(file.listFiles(new FileFilterCustom()));
		// 打印
		for (File tempFile : listFile) {
			System.out.println(tempFile.getAbsolutePath() + "=----");
		}
		Map<String, List<Integer>> fileLineNumberMap = getFileLineNumber(listFile, "张无忌");
		for (Entry<String, List<Integer>> entry : fileLineNumberMap.entrySet()) {
			System.out.println(entry.getKey() + "  " + entry.getValue());
		}

	}

	/**
	 * 返回文件对应的行列表： key=文件名，value=所出现的行(1,5,20)
	 * 
	 * @param listFile
	 *            文件列表
	 * @param content
	 *            查找的内容
	 * @return
	 */
	static Map<String, List<Integer>> getFileLineNumber(List<File> listFile, String content) {
		Map<String, List<Integer>> fileLineNumberMap = new HashMap<>();
		for (File tempFile : listFile) {
			List<Integer> lineNumberList = getFileLineNumber(tempFile, content);
			if (lineNumberList == null || lineNumberList.isEmpty()) {
				continue;
			}
			fileLineNumberMap.put(tempFile.getAbsolutePath(), lineNumberList);

		}
		return fileLineNumberMap;
	}

	/**
	 * 返回文件对应的行列表所出现的行(1,5,20)
	 * 
	 * @param listFile
	 * @return
	 */
	static List<Integer> getFileLineNumber(File file, String content) {
		List<Integer> list = new ArrayList();
		LineNumberReader reader = null;
		try {
			reader = new LineNumberReader(new FileReader(file));
			String value = null;
			int i = 0;
			while ((value = reader.readLine()) != null) {
				i++;
				if(value.contains(content)){
					list.add(i);
				}
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			try {
				reader.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return list;
	}

	static List<File> getFile(File[] listFile) {
		List<File> returnList = new ArrayList<>();
		for (File tempFile : listFile) {
			if (tempFile.isDirectory()) {
				returnList.addAll(getFile(tempFile.listFiles(new FileFilterCustom())));
			} else {
				returnList.add(tempFile);
			}
		}
		return returnList;
	}
}

class FileFilterCustom implements FileFilter {
	@Override
	public boolean accept(File pathname) {
		if (pathname.isDirectory()) {
			return true;
		}
		return pathname.getName().contains("屠龙");
	}
}
